//
//  XSquareNewsListViewModel.swift
//  WeiBoReDo
//
//  Created by 放学跟鸽走 on 2017/4/16.
//  Copyright © 2017年 放学跟鸽走. All rights reserved.
//

import Foundation
import SDWebImage
class XSquareNewsListViewModel {
    
    lazy var modelList:[XSquareNewsViewModel] = [XSquareNewsViewModel]()
    
    /// 默认上次的页码
    var lastPageIndex:Int = 1
    
    /// 点赞操作
    ///
    /// - Parameter complete: _ isSuccess:Bool
    /// - isSuccess:操作是否成功
    func likeSquare(row:Int,id:Int,complete:@escaping (_ isSuccess:Bool)->()){
        
        XNetworkManager.shared.likeSquare(id: id) { (array, isSuccess) in
            //判断是否请求成功
            if isSuccess{
                guard  let likeArray:[XSquareReply] = NSArray.yy_modelArray(with: XSquareReply.self, json: array ?? []) as? [XSquareReply]
                    else{
                        complete(false)
                        return
                }
                self.modelList[row].squareNews?.likeArray = likeArray
                complete(true)
            }else{
                complete(false)
            }
            
        }
    }
    
    
    
    
    
    func getSquareNews(isPull:Bool=false,complete:@escaping (_ isSuccess:Bool)->()){
        
        //判断是否是上拉刷新
        var page = 1
        if isPull{
            //是上拉刷新，将上次的页码加1赋值给本次请求参数page
            page = lastPageIndex + 1
        }
        XNetworkManager.shared.getSquareList(page: page) { (page,array, isSuccess) in
            if isSuccess{
                //记录页码
                self.lastPageIndex = page
                /// 定义临时存储视图模型的数组
                var tempList:[XSquareNewsViewModel] = [XSquareNewsViewModel]()
                guard let tempModelList:[XSquareNews] = NSArray.yy_modelArray(with: XSquareNews.self, json: array ?? []) as? [XSquareNews]
                    else{
                        complete(false)
                        return
                }
                print(tempModelList);
                // 调度组
                let group = DispatchGroup()
                for (i,news) in tempModelList.enumerated(){
                    let id = news.forwardId
                    
                    if id > 0{
                        group.enter()
                        XNetworkManager.shared.getSingleSquare(id: id, complete: { (json, isSuccess) in
                            //
                            //获取对应鸽友圈的数据
                            if let news = XSquareRetweetNews.yy_model(with: json ?? [:]){
                                tempModelList[i].forwardContent = news
                            }
                            group.leave()
                        })
                    }
                }
                group.notify(queue: .main, execute: {
                    
                    //遍历数组
                    for news in tempModelList{
                        //实例化数组
                        let viewModel:XSquareNewsViewModel = XSquareNewsViewModel(model: news)
                        //添加到临时数组
                        tempList.append(viewModel)
                    }
                    //判断数组有没有数据
                    if  tempList.count > 0 {
                        //有数据
                        //判断是否是上拉刷新，然后对视图模型数组进行处理
                        if isPull {
                            //是上拉刷新，直接添加到后面
                            self.modelList = self.modelList + tempList
                        }else{
                            //是下拉刷新，目前的处理是直接赋值，而不是添加到前面
                            //FIXME:下拉刷新数组进行处理，希望之后能将没有变化的数组不更新，有变化的将新数据添加到头部
                            self.modelList = tempList
                        }
                        //下载单张图片
                        
                        self.cacheSingleImage(list: tempList, finished: complete)
                        
                        
                    }else{
                        //没有数据
                        complete(false)
                    }
                })
            }else{
                //失败
                complete(false)
            }
            
        }
    }
    /// 加载转发鸽友圈
//    func loadForwardSquareNews(tempList:[XSquareNewsViewModel],complete:@escaping ()->()){
//        // 调度组
//        let group = DispatchGroup()
//        //先找出是转发的鸽友圈
//        for (i,item) in tempList.enumerated(){
//            //获取转发的ID
//            let id = item.squareNews?.forwardId ?? 0
//            if id > 0 {
//                group.enter()
//                XNetworkManager.shared.getSingleSquare(id: id, complete: { (json, isSuccess) in
//                    //
//                    //获取对应鸽友圈的数据
//                    if let news = XSquareNews.yy_model(with: json ?? [:]){
//                        tempList[i].squareNews?.forwardContent = news
//                    }
//                    group.leave()
//                })
//                //                item.squareNews?.forwardContent = self.loadForwardSquareNews(id: id)
//            }
//        }
//        group.notify(queue: .main) {
//            complete()
//        }
//        
//        //        return tempList
//        
//    }
    /// 缓存本次下载微博数据数组中的单张图像
    ///
    /// - 应该缓存完单张图像，并且修改过配图是的大小之后，再回调，才能够保证表格等比例显示单张图像！
    ///
    /// - parameter list: 本次下载的视图模型数组
    private func cacheSingleImage(list: [XSquareNewsViewModel], finished: @escaping (_ shouldRefresh: Bool)->()) {
        
        // 调度组
        let group = DispatchGroup()
        
        // 记录数据长度
        var length = 0
        
        // 遍历数组，查找微博数据中有单张图像的，进行缓存
        // option + cmd + 左，折叠代码
        for vm in list {
            
            // 1> 判断图像数量
            if vm.picURLs?.count != 1 {
                continue
            }
            
            // 2> 代码执行到此，数组中有且仅有一张图片
            guard let pic = vm.picURLs?[0].thumbnail_pic,
                let url = URL(string: pic) else {
                    continue
            }
            
            // print("要缓存的 URL 是 \(url)")
            
            // 3> 下载图像
            // 1) downloadImage 是 SDWebImage 的核心方法
            // 2) 图像下载完成之后，会自动保存在沙盒中，文件路径是 URL 的 md5
            // 3) 如果沙盒中已经存在缓存的图像，后续使用 SD 通过 URL 加载图像，都会加载本地沙盒地图像
            // 4) 不会发起网路请求，同时，回调方法，同样会调用！
            // 5) 方法还是同样的方法，调用还是同样的调用，不过内部不会再次发起网路请求！
            // *** 注意点：如果要缓存的图像累计很大，要找后台要接口！
            
            // A> 入组
            group.enter()
            _ = SDWebImageManager.shared().imageDownloader?.downloadImage(with: url, options: [], progress: nil, completed: { (image, _, _, _) in
                // 将图像转换成二进制数据
                if let image = image,
                    let data = UIImagePNGRepresentation(image) {
                    
                    // NSData 是 length 属性
                    length += data.count
                    
                    // 图像缓存成功，更新配图视图的大小
                    vm.updateSingleImageSize(image: image)
                }
                
                print("缓存的图像是 \(String(describing: image)) 长度 \(length)")
                
                // B> 出组 - 放在回调的最后一句
                group.leave()
            })
            
        }
        
        // C> 监听调度组情况
        group.notify(queue: DispatchQueue.main) {
            print("图像缓存完成 \(length / 1024) K")
            
            // 执行闭包回调
            finished(true)
        }
    }
    
}
